# -*- encoding:utf-8 -*-
# @Time: 2022/11/9 21:09
# @Author :xibin
# @Email: xibin@maqu. com
# @File: permission.py
# @Software: PyCharm
from functools import update_wrapper

from rest_framework.permissions import BasePermission
from django.contrib.auth.models import Group
from rest_framework.response import Response


class TeacherPermission(BasePermission):  #自定义权限管理
    def has_permission(self, request, view): #看传过来的数据是否有权限，有则返回具体的功能，返回布尔值
        user = request.user #获取到当前发送请求的用户信息
        #判断身份，查询用户是否在老师分组
        group = Group.objects.filter(name='老师').first() #获取老师组
        user_groups = user.groups.all()  #获取传过来的用户所在的用户组
        return user.is_superuser or group in user_groups  #此处返回布尔值   （看看是否user_groups包含group）

class ActiveUserPermission(BasePermission):
    def has_permission(self, request, view):
        #操作的用户必须是当前登陆的用户
        user = request.user
        return user.id == int(view.kwargs['pk'])  #当前登陆的id是否是提交到视图里的id  因为一个人要修改别人的id就要向后台发起请求，会传到视图
        #因为返回视图的是键值对的形式，所以要int转一下，最后返回 True或 False

class ActiveUserPPPermission(BasePermission):  #修改题目权限，只能自己改
    def has_permission(self, request, view):
        #操作的用户必须是当前登陆的用户
        user = request.user
        return user.id == int(request.data.get('user'))

#更改权限装饰器
def wrap_permission(*permissions,validate_permission=True):  #后面是说默认启用权限控制
    def decorator(func):
        def wrapper(self,request,*args,**kwargs):
            self.permission_classes = permissions #接收权限
            if validate_permission:  #是不是要启用权限认证(默认启用)
                self.check_permissions(request)  #检测请求里是否有权限控制
            return func(self,request,*args,**kwargs)  #返回实际上执行的功能
        return update_wrapper(wrapper,func)  #返回当前修改的功能
    return decorator

def auto_user(func): #此操作表示谁创建和修改的类标签(题目)就关联到谁
    def wrapper(self,request,*args,**kwargs):
        request.POST._mutable = True #让请求参数可以进行更改
        request.data['user'] = request.user.id

        return func(self,request,*args,**kwargs)
    return wrapper

class RootPersion(BasePermission):  #是超级管理员才能去做题目删除
    def has_permission(self, request, view):
        user = request.user
        return user.is_superuser

def update_auto_user(func):
    def wrapper(self,request,*args,**kwargs):
        #判断当前操作的用户是不是这个数据的创建者
        #设，文章的id为3，作者的id为1，当前登陆用户为5
        #所有的没有被逻辑删除的文章数据集里面的id=1，并且用户id为5
        res = self.get_queryset().filter(id=kwargs['pk'],user=request.user)
        if not res:
            return Response({'detail':'您没有修改的权限'})
        #修改不可以更改作者，只能是当前登陆的用户
        request.POST._mutable = True  #让参数允许被修改
        request.data['user'] = request.user.id
        return func(self,request,*args,**kwargs)
    return wrapper

def destroy_auto_user(func):
    def wrapper(self,request,*args,**kwargs):

        res = self.get_queryset().filter(id=kwargs['pk'],user=request.user)
        if not res:
            return Response({'detail':'您没有删除的权限'})

        return func(self,request,*args,**kwargs)
    return wrapper

